const cron = require('node-cron');
const db = require('../db');
const logger = require('../utils/logger');
const feishuService = require('./feishuService');

class ScheduleService {
  constructor() {
    // 初始化定时任务列表,返回的任务对象没有被保存为成员变量或全局变量，可能被 GC 回收，导致只执行一次。
    // this.cronJobs = [];
    // 启动定时任务
    this.startCronJobs();
  }

  // 启动所有定时任务
  startCronJobs() {
    // console.log('启动定时任务...');
    // // 每天下午5点执行 (分钟 小时 日 月 周)
    // const job = cron.schedule('0 17 * * *', () => {
    //   // console.log('执行每天下午5点的定时任务: 发送第二天值班提醒');
    //   logger.info('执行每天下午5点的定时任务: 发送第二天值班提醒');
    //   // 调用发送明天值班提醒的方法
    //   this.sendTomorrowShiftReminders();
    // });
    // this.cronJobs.push(job);
    // 为了测试方便，添加一个每分钟执行的任务
    cron.schedule('* * * * *', () => {
      logger.info('每分钟执行一次任务');

      //获取系统当前时间  
      let date = new Date();
      let hours = date.getHours();       //获取当前小时数(0-23)
      let minutes = date.getMinutes();   //获取当前分钟数(0-59)
      // let seconds = date.getSeconds();   //获取当前秒数(0-59)
      //判断当前时间是否为17:00:00
      if (hours === 17 && minutes === 0) {
        logger.info('执行每天下午5点的定时任务: 发送第二天值班提醒');
        this.sendTomorrowShiftReminders();
      }
    });
  }

  // 获取明天的日期字符串 (YYYY-MM-DD)
  getTomorrowDate() {
    const tomorrow = new Date();
    tomorrow.setDate(tomorrow.getDate() + 1);
    return tomorrow.toISOString().split('T')[0];
  }

  // 查询明天值班的所有人员
  async getTomorrowShifts() {
    return new Promise((resolve, reject) => {
      const tomorrow = this.getTomorrowDate();
      const sql = `SELECT s.*, st.name as shift_type_name, e.name as employee_name, e.type as employee_type, e.feishu_user_id 
                   FROM schedules s
                   LEFT JOIN shift_types st ON s.shift_type_id = st.id
                   LEFT JOIN employees e ON s.employee_id = e.id
                   WHERE s.schedule_date = ?`;

      db.all(sql, [tomorrow], (err, rows) => {
        if (err) {
          reject(err);
          return;
        }
        resolve(rows);
      });
    });
  }

  // 发送明天值班提醒
  async sendTomorrowShiftReminders() {
    try {
      const shifts = await this.getTomorrowShifts();
      if (shifts.length === 0) {
        // console.log('明天没有排班记录');
        logger.info('明天没有排班记录');
        return;
      }

      // 按人员分组
      const shiftsByEmployee = shifts.reduce((acc, shift) => {
        const key = shift.employee_id;
        if (!acc[key]) {
          acc[key] = {
            employee_name: shift.employee_name,
            feishu_user_id: shift.feishu_user_id,
            shifts: []
          };
        }
        acc[key].shifts.push({
          shift_type_name: shift.shift_type_name,
          schedule_date: shift.schedule_date
        });
        return acc;
      }, {});

      // 发送消息给每个值班人员
      for (const employeeId in shiftsByEmployee) {
        const employee = shiftsByEmployee[employeeId];
        let messageContent = `亲爱的${employee.employee_name}，您好！\n\n`;
        messageContent += `您明天(${shifts[0].schedule_date})有以下值班安排：\n`;

        employee.shifts.forEach(shift => {
          messageContent += `- ${shift.shift_type_name}\n`;
        });

        messageContent += `\n请提前做好准备，谢谢！`;

        // 获取员工的飞书用户ID
        // 注意：这里假设shifts数组中已经包含了feishu_user_id字段
        // 实际应用中，需要确保从数据库查询时包含此字段
        const feishuUserId = employee.feishu_user_id;

        if (!feishuUserId) {
          // console.log(`未找到 ${employee.employee_name} 的飞书用户ID (${employee.feishu_user_id})，跳过发送`);
          logger.warn(`未找到 ${employee.employee_name} 的飞书用户ID (${employee.feishu_user_id})，跳过发送`);
          continue;
        }

        try {
          await feishuService.sendTextMessage(feishuUserId, messageContent);
          // console.log(`已发送提醒给 ${employee.employee_name}`);
          logger.info(`已发送提醒给 ${employee.employee_name}`);

        } catch (error) {
          // console.error(`发送消息给 ${employee.employee_name} 失败:`, error.message);
          logger.error(`发送消息给 ${employee.employee_name} 失败: ${error.message}`);
        }
      }
    } catch (error) {
      // console.error('发送值班提醒失败:', error.message);
      logger.error('发送值班提醒失败:', error.message);
    }
  }
}

module.exports = new ScheduleService();